package com.dragon.datastructure.stack;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;

/**
 * 后缀表达式的计算
 *
 * @author dragon
 * @since 2019/12/19
 */
public class SuffixExpressionCalculate {

    public static void main(String[] args) {
        SuffixExpressionCalculate calculate = new SuffixExpressionCalculate();
        System.out.println(calculate.calculate("4 5 * 8 - 60 + 8 2 / +"));
    }


    /**
     * 通过给定的后缀表达式计算
     *
     * @param suffixExpression 后缀表达式的语句，注意需要有空格
     * @return 计算之后的结果
     */
    public int calculate(String suffixExpression) {
        List<String> suffixList = toSuffixList(suffixExpression);

        return doCalculate(suffixList);
    }

    /**
     * 通过给点的后缀表达式的集合来计算
     *
     * @param suffixExpressionList 后缀表达式的集合
     * @return 计算得到的结果
     */
    public int calculate(List<String> suffixExpressionList) {

        return doCalculate(suffixExpressionList);
    }

    private int doCalculate(List<String> suffixList) {
        ArrayDeque<String> deque = new ArrayDeque<>();
        for (String item : suffixList) {
            if (item.matches("\\d+")) {
                deque.push(item);
                continue;
            }
            Integer top = Integer.valueOf(deque.pop());
            Integer secondTop = Integer.valueOf(deque.pop());
            if (item.equals("*")) {
                deque.push(top * secondTop + "");
            } else if (item.equals("+")) {
                deque.push(top + secondTop + "");
            } else if (item.equals("-")) {
                deque.push(secondTop - top + "");
            } else if (item.equals("/")) {
                deque.push(secondTop / top + "");
            }
        }

        return Integer.valueOf(deque.pop());
    }

    /**
     * 将后缀表达式转换为集合
     *
     * @param suffixExpression 后缀表达式
     * @return 后缀表达式的集合
     */
    private List<String> toSuffixList(String suffixExpression) {
        ArrayList<String> list = new ArrayList<>();
        String[] suffixExpressionArray = suffixExpression.split(" ");
        for (String item : suffixExpressionArray) {
            list.add(item);
        }

        return list;
    }

}
